iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Software Development

Event driven architecture的奧妙系列 第 26

Day 26 - Event Broker的法寶: Nats - CoreNATS (續)

  • 分享至 

  • xImage
  •  

前言

昨天我們講了什麼是CoreNATS是什麼,它在NATS中扮演什麼樣的角色,也探討Subject based Message的優點跟subject的機制。

今天的文章中,我們接著講Subject based Message。

好了~讓我們開始吧!

CoreNATS - Subject Based Message

昨天文章中有提到,CoreNATS的subject表示一個字串,這個字串作為訊息的type。
當publisher將訊息發送到NATS裡的某個subject,有subscribe這subject的scriber會收到這筆訊息。

https://ithelp.ithome.com.tw/upload/images/20241010/201690968bSDSPdk40.jpg

我們歸類subject的特性:

  • subscriber可subscribe感興趣的subject
  • 訊息會被route到所有subscribe的subscriber
  • 訊息如果沒有被subsriber subsribe,會被自動捨棄

注意喔,不是每個Event Broker和Message Queue都叫subject,可能會叫topicschannels, 或是stream,很常會被認為是不同東西。

Wildcard

在CoreNATS中,wildcard用來subscribe subject的一種機制,允許subscriber同時匹配多個subject。
對於需要接收多種有關訊息的情況特別適合。

在一個電商平台的訂單系統中,可能會涉及多個相關的主題,像是訂單的創建、更新和取消等。以下是如何使用通配符來簡化消息的接收。

wildcard的type有分兩種:

  • 單層的wildcard( * )
  • 多層的wildcard( > )

我們舉訂單系統為例子:

https://ithelp.ithome.com.tw/upload/images/20241010/20169096CyPrH66tMf.jpg

訂單系統可能會有多個有關的subject,像是建立、更新以及取消訂單,subject的架構就會像這樣:

orders.created
orders.updated
orders.cancelled

如果想要接收所有與訂單狀態有關的訊息,就可以用單層wildcard。
例如,orders.*可以讓你接收到所有跟訂單狀態有關的訊息,不會接收到其他類型的訊息。
若有orders.cancelled的訊息被發布上來,卻沒有subscriber subscribe的話,這筆訊息就會被捨棄掉。

如果想要擴展到了不同的程式,subject會變成如下:

orders.taipei.created
orders.taipei.updated
orders.taipei.
orders.taichung.created
orders.taichung.updated
orders.taichung.cancelled
...

如果你想接收所有城市的所有訂單相關訊息,包含建立、更新和取消,可以使用多層wildcard orders.>,可以讓subscriber接收到所有城市的任何訊息。
若subscriber只想要接收台北所有訂單的訊息,可用orders.taipei.*

CoreNATS的缺點

雖然上面講了很多CoreNATS帶給開發人員很高的靈活性與可靠性,但也有一些缺點:

  • 訊息持久化: CoreNATS的訊息不具備持久化,這代表subscriber在訊息發佈時沒有及時接收,訊息會被丟棄
  • 訊息排序: CoreNATS不保證訊息的順序,可能某些情境不適合

總結

在考慮使用CoreNATS的時候,了解優缺點是非常重要的。團隊在設計系統架構時需要考量CoreNATS所帶來的限制和學習曲線,對於不熟EDA或NATS的人來講,一下子要上手會比較困難,這點也需要考慮進去。

好了~~今天就到這邊!!

Reference


上一篇
Day 25 Event Broker的法寶: Nats - CoreNATS
下一篇
Day 27 Nats的補充包JetStream - 前篇
系列文
Event driven architecture的奧妙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言